home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / PROGRAMMING / DESKLIBC / SOURCES.ZIP / DeskLib / !DLSources / Libraries / File / s / FileOps < prev    next >
Encoding:
Text File  |  1995-08-28  |  9.7 KB  |  348 lines

  1. ;
  2. ;   ####             #    #     # #
  3. ;   #   #            #    #       #          The FreeWare C library for
  4. ;   #   #  ##   ###  #  # #     # ###             RISC OS machines
  5. ;   #   # #  # #     # #  #     # #  #   ___________________________________
  6. ;   #   # ####  ###  ##   #     # #  #
  7. ;   #   # #        # # #  #     # #  #    Please refer to the accompanying
  8. ;   ####   ### ####  #  # ##### # ###    documentation for conditions of use
  9. ;   ________________________________________________________________________
  10. ;
  11. ;   File:    File.s.OpenClose
  12. ;   Author:  Copyright © 1993, 1995 Jason Williams and Sergio Monesi
  13. ;   Version: 1.02 (01 Aug 1995)
  14. ;   Purpose: SWI veneers for file operations
  15. ;              open a file for read/write
  16. ;              close an open file
  17. ;              get EOF status
  18. ;              read file extent
  19. ;              read/write file position, single byte & word, multiple bytes
  20. ;   Mods:    1.02 (01 Aug 1995) Sergio Monesi
  21. ;                 Added File_ReadExtent
  22.  
  23. ;   NOTES:   I have bundled all of these operations into a single .s/.o file
  24. ;            because typically if any of them are used, most of them are used,
  25. ;            and they are all pretty small. You can always use this source
  26. ;            file and remove the bits you don't want if you so desire.
  27. ;            By doing this, I have been able to make access to file_lasterror
  28. ;            more efficient (saving one LDR in each function)
  29.  
  30.         GET     ^.h.regdefs
  31.         GET     ^.h.swinos
  32.         GET     ^.h.macros
  33. ;
  34.         PREAMBLE
  35.  
  36. ;
  37. ; ---------------------------------------------------------------------------
  38. ;
  39.  
  40. ; extern os_error *file_lasterror;
  41. ; (Global variable which holds the last file error generated)
  42. ;
  43.         EXPORT  file_lasterror
  44. file_lasterror
  45.         DCD 0
  46. ;
  47. ; ---------------------------------------------------------------------------
  48. ;
  49.         STARTCODE File_Open
  50. ;
  51. ; extern file_handle File_Open(char *filename, file_access access);
  52. ;
  53.         STMFD   sp!, {lr}
  54.  
  55.         MOV     a3, a2     ; Swap a1 and a2 to keep a consistent C interface
  56.         MOV     a2, a1
  57.         MOV     a1, a3
  58.  
  59.         MOV     a3, #0
  60.  
  61.         SWI     SWI_OS_Find + XOS_Bit
  62.  
  63.         MOVVC   a2, #0                   ; No error, so reset file_lasterror
  64.         MOVVS   a2, a1                   ; else store error pointer
  65.         STR     a2, file_lasterror
  66.  
  67.         MOVVS   a1, #0                   ; Error - return handle = NULL
  68.  
  69.         LDMFD   sp!, {pc}^
  70. ;
  71. ; ---------------------------------------------------------------------------
  72. ;
  73.         STARTCODE File_Close
  74. ;
  75. ; extern os_error *File_Close(file_handle a1);
  76. ;
  77.         STMFD   sp!, {lr}
  78.  
  79.         MOV     a2, a1
  80.         MOV     a1, #0
  81.  
  82.         SWI     SWI_OS_Find + XOS_Bit
  83.  
  84.         MOVVC   a1, #0                   ; No error, so reset file_lasterror
  85.         STR     a1, file_lasterror       ; Store error condition
  86.  
  87.         LDMFD   sp!, {pc}^
  88. ;
  89. ; ---------------------------------------------------------------------------
  90. ;
  91.         STARTCODE File_EOF
  92. ;
  93. ; extern BOOL File_EOF(file_handle a1);
  94. ;
  95.         STMFD   sp!, {lr}
  96.  
  97.         MOV     a2, a1
  98.         MOV     a1, #5
  99.  
  100.         SWI     SWI_OS_Args + XOS_Bit
  101.  
  102.         MOVVC   a2, #0
  103.         MOVVS   a2, a1
  104.         STR     a2, file_lasterror
  105.  
  106.         MOV     a1, a3             ; Return EOF flag
  107.  
  108.         LDMFD   sp!, {pc}^
  109. ;
  110. ; ---------------------------------------------------------------------------
  111. ;
  112.         STARTCODE File_Seek
  113. ;
  114. ; extern os_error *File_Seek(file_handle a1, file_position position);
  115. ;
  116.         STMFD   sp!, {lr}
  117.  
  118.         MOV     a3, a2
  119.         MOV     a2, a1
  120.         MOV     a1, #1
  121.  
  122.         SWI     SWI_OS_Args + XOS_Bit
  123.  
  124.         MOVVC   a1, #0
  125.         STR     a1, file_lasterror
  126.  
  127.         LDMFD   sp!, {pc}^
  128. ;
  129. ; ---------------------------------------------------------------------------
  130. ;
  131.         STARTCODE File_ReturnPos
  132. ;
  133. ; extern file_position File_ReturnPos(file_handle a1);
  134. ;
  135.         STMFD   sp!, {lr}
  136.  
  137.         MOV     a2, a1
  138.         MOV     a1, #0
  139.  
  140.         SWI     SWI_OS_Args + XOS_Bit
  141.  
  142.         MOVVC   a1, #0
  143.         STR     a1, file_lasterror
  144.  
  145.         MOV     a1, a3        ; return file position
  146.  
  147.         LDMFD   sp!, {pc}^
  148. ;
  149. ; ---------------------------------------------------------------------------
  150. ;
  151.         STARTCODE File_ReadExtent
  152. ;
  153. ; extern int File_ReadExtent(file_handle a1);
  154. ;
  155.         STMFD   sp!, {lr}
  156.  
  157.         MOV     a2, a1
  158.         MOV     a1, #2
  159.  
  160.         SWI     SWI_OS_Args + XOS_Bit
  161.  
  162.         MOVVC   a1, #0
  163.         STR     a1, file_lasterror
  164.  
  165.         MOV     a1, a3        ; return file extent
  166.         MOVVS    a1, #-1
  167.  
  168.         LDMFD   sp!, {pc}^
  169. ;
  170. ; ---------------------------------------------------------------------------
  171. ;
  172.         STARTCODE File_WriteBytes
  173. ;
  174. ; extern os_error *File_WriteBytes(file_handle a1, void *buffer, int numbytes);
  175. ;
  176.         STMFD   sp!, {v1-v4, lr}
  177.  
  178.         MOV     a4, a3
  179.         MOV     a3, a2
  180.         MOV     a2, a1
  181.         MOV     a1, #2
  182.  
  183.         SWI     SWI_OS_GBPB + XOS_Bit
  184.  
  185.         MOVVC   a1, #0
  186.         STR     a1, file_lasterror
  187.  
  188.         LDMFD   sp!, {v1-v4, pc}^
  189. ;
  190. ; ---------------------------------------------------------------------------
  191. ;
  192.         STARTCODE File_ReadBytes
  193. ;
  194. ; extern int File_ReadBytes(file_handle a1, char *buffer, int numbytes);
  195. ;
  196.         STMFD   sp!, {v1-v4, lr}
  197.  
  198.         MOV     a4, a3
  199.         MOV     a3, a2
  200.         MOV     a2, a1
  201.         MOV     a1, #4
  202.  
  203.         SWI     SWI_OS_GBPB + XOS_Bit
  204.  
  205.         MOVVC   a1, #0
  206.         STR     a1, file_lasterror
  207.  
  208.         MOV     a1, a4               ; Return number of bytes not read
  209.  
  210.         LDMFD   sp!, {v1-v4, pc}^
  211. ;
  212. ; ---------------------------------------------------------------------------
  213. ;
  214.         STARTCODE File_Read8
  215. ;
  216. ; extern int File_Read8(file_handle a1);
  217. ;
  218.         STMFD   sp!, {lr}
  219.  
  220.         MOV     a2, a1
  221.         MOV     a1, #0
  222.  
  223.         SWI     SWI_OS_BGet + XOS_Bit
  224.  
  225.         MOVVC   a2, #0
  226.         MOVVS   a2, a1
  227.         STR     a2, file_lasterror      ; Store error pointer or NULL
  228.  
  229.         MVNVS   a1, #0                  ; Return -1 to indicate error
  230.  
  231.         LDMFD   sp!, {pc}^
  232. ;
  233. ; ---------------------------------------------------------------------------
  234. ;
  235.         STARTCODE File_Read32
  236. ;
  237. ; extern int File_Read32(file_handle a1);
  238. ;
  239.         STMFD   sp!, {v1-v4, lr}
  240.  
  241.         SUB     sp, sp, #4       ; Reserve 4 bytes of workspace
  242.  
  243.         MOV     a4, #4           ; Read 4 bytes
  244.         MOV     a3, sp           ; Into space reserved on stack
  245.         MOV     a2, a1           ; From the given file
  246.         MOV     a1, #4
  247.  
  248.         SWI     SWI_OS_GBPB + XOS_Bit
  249.  
  250.         MOVVC   a2, #0
  251.         MOVVS   a2, a1
  252.         STR     a2, file_lasterror
  253.  
  254.         LDR     a1, [sp], #4     ; Return the word, restore stack pointer
  255.         MVNVS   a1, #0           ; If error, then return -1
  256.  
  257.         LDMFD   sp!, {v1-v4, pc}^
  258. ;
  259. ; ---------------------------------------------------------------------------
  260. ;
  261.         STARTCODE File_Read32R
  262. ;
  263. ; extern int File_Read32R(file_handle a1);
  264. ;
  265.         STMFD   sp!, {lr}
  266.         BL      File_Read32                 ; Read the 32-bit value into a1
  267.                                             ; ... and then reverse the bytes
  268.                                             ;  a1    a2    a3
  269.                                             ; 1234
  270.         MOV     a2, a1, LSR #24             ;       xxx1
  271.         BIC     a1, a1, #&FF000000          ; x234
  272.         MOV     a3, a1, LSR #16             ;             xxx2
  273.         ORR     a2, a2, a3, LSL #8          ;       xx21
  274.         AND     a3, a1, #&000000FF          ;             xxx4
  275.         AND     a1, a1, #&0000FF00          ; xx3x
  276.         ORR     a2, a2, a1, LSL #8          ;       x321
  277.         ORR     a1, a2, a3, LSL #24         ; 4321
  278.         LDMFD   sp!, {pc}^
  279. ;
  280. ; ---------------------------------------------------------------------------
  281. ;
  282.         STARTCODE File_Write8
  283. ;
  284. ; extern os_error *File_Write8(file_handle a1, int byte);
  285. ;
  286.         STMFD   sp!, {lr}
  287.  
  288.         MOV     a3, a2        ; Swap r0 and r1 over to retain a consistent
  289.         MOV     a2, a1        ; C interface (handle always 1st arg)
  290.         MOV     a1, a3
  291.  
  292.         SWI     SWI_OS_BPut + XOS_Bit
  293.  
  294.         MOVVC   a1, #0
  295.         STR     a1, file_lasterror
  296.  
  297.         LDMFD   sp!, {pc}^
  298. ;
  299. ; ---------------------------------------------------------------------------
  300. ;
  301.         STARTCODE File_Write32
  302. ;
  303. ; extern os_error *File_Write32(file_handle a1, int word);
  304. ;
  305.         STMFD   sp!, {v1-v4, lr}
  306.  
  307.         SUB     sp, sp, #4       ; Reserve 4 bytes of workspace
  308.         STR     a2, [sp]         ; Place word to write into workspace
  309.  
  310.         MOV     a4, #4           ; Write 4 bytes
  311.         MOV     a3, sp           ; From space reserved on stack
  312.         MOV     a2, a1           ; To the given file
  313.         MOV     a1, #2
  314.  
  315.         SWI     SWI_OS_GBPB + XOS_Bit
  316.  
  317.         ADD     sp, sp, #4       ; restore stack pointer
  318.  
  319.         MOVVC   a1, #0
  320.         STR     a1, file_lasterror
  321.  
  322.         LDMFD   sp!, {v1-v4, pc}^
  323. ;
  324. ; ---------------------------------------------------------------------------
  325. ;
  326.         STARTCODE File_Write32R
  327. ;
  328. ; extern os_error *File_Write32R(file_handle a1, int a2);
  329. ;
  330.         STMFD   sp!, {lr}
  331.                                             ;  a2    a4    a3
  332.                                             ; 1234
  333.         MOV     a4, a2, LSR #24             ;       xxx1
  334.         BIC     a2, a2, #&FF000000          ; x234
  335.         MOV     a3, a2, LSR #16             ;             xxx2
  336.         ORR     a4, a4, a3, LSL #8          ;       xx21
  337.         AND     a3, a2, #&000000FF          ;             xxx4
  338.         AND     a2, a2, #&0000FF00          ; xx3x
  339.         ORR     a4, a4, a2, LSL #8          ;       x321
  340.         ORR     a2, a4, a3, LSL #24         ; 4321
  341.  
  342.         BL      File_Write32                ; Write the word
  343.         LDMFD   sp!, {pc}^
  344. ;
  345. ; ---------------------------------------------------------------------------
  346. ;
  347.         END
  348.